﻿#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
//练习1：编写代码实现：求⼀个整数存储在内存中的⼆进制中1的个数。

//1、把一个十进制数转化为二进制 %2 /2
//int main()
//{
//	int num = 10;
//	int count = 0;
//	while (num)
//	{
//		if (num % 2 == 1)
//		{
//			count++;
//		}
//		num /= 2;
//	}
//	printf("二进制中1的个数:%d", count);
//	return 0;
//}

//这种方法有缺陷 对负数会失效

//改进2、一个数与1按位与后 得到其最右边的一个数 通过判断是否是1计数 然后右移位
//int main()
//{
//	int num = 0;
//	scanf("%d", &num);
//	int i = 0;
//	int count = 0;
//	for (i = 0; i < 32; i++)//右移31次遍历每个二进制位
//	{
//		if (((num >> i) & 1) == 1)
//		{
//			count++;
//		}
//	}
//	printf("%d存储在内存中二进制中1的个数位%d", num, count);
//	return 0;
//}

//改进3、采用更好的算法
// 给一个数n 那么n&（n-1）每次都能将n存储在内存中的二进制序列中的最右边的1去掉
//如 5              00000000000000000000000000000101
// 5-1              00000000000000000000000000000100
// //按位与后       00000000000000000000000000000100
int main()
{
	int num = 0;
	scanf("%d", &num);
	int t = num;
	int count = 0;
	while (num)
	{
		num = num & (num - 1);
		count++;
	}
	printf("%d存储在内存中二进制序列1的个数为%d", t, count);
	return 0;
}